// server.js
const WebSocket = require('ws');

const wss = new WebSocket.Server({ port: 8888 }); // 服务器监听 8888 端口

// 用于存储所有连接的客户端
const clients = new Set();
let clientIdCounter = 0; // 用于为客户端分配简单ID

console.log('WebSocket 聊天服务器已在端口 8888 上启动...');

wss.on('connection', (ws) => {
    const clientId = ++clientIdCounter; // 分配一个简单的ID
    ws.clientId = clientId; // 将ID附加到ws对象上，方便识别
    clients.add(ws);
    console.log(`客户端 ${clientId} 已连接`);

    // 向所有客户端广播新用户加入的消息
    broadcastMessage(JSON.stringify({ type: 'system', message: `用户 ${clientId} 加入了聊天室` }), null);


    // 当从客户端收到消息时
    ws.on('message', (messageAsString) => {
        console.log(`收到来自客户端 ${ws.clientId} 的消息: ${messageAsString}`);

        let parsedMessage;
        try {
            parsedMessage = JSON.parse(messageAsString);
        } catch (e) {
            // 如果消息不是 JSON，可能是原始文本
            parsedMessage = { type: 'chat', sender: `用户 ${ws.clientId}`, text: messageAsString.toString() };
        }

        // 为聊天消息添加发送者信息（如果客户端没有提供）
        if (parsedMessage.type === 'chat' && !parsedMessage.sender) {
            parsedMessage.sender = `用户 ${ws.clientId}`;
        }

        // 将消息广播给所有其他连接的客户端
        broadcastMessage(JSON.stringify(parsedMessage), ws);
    });

    // 当客户端断开连接时
    ws.on('close', () => {
        clients.delete(ws);
        console.log(`客户端 ${ws.clientId} 已断开连接`);
        // 向所有客户端广播用户离开的消息
        broadcastMessage(JSON.stringify({ type: 'system', message: `用户 ${ws.clientId} 离开了聊天室` }), null);
    });

    // 处理错误
    ws.on('error', (error) => {
        console.error(`客户端 ${ws.clientId} 发生错误:`, error);
        clients.delete(ws); // 发生错误时也移除客户端
    });
});

// 广播消息给所有客户端 (除了发送者，除非 senderToExclude 为 null)
function broadcastMessage(message, senderToExclude) {
    clients.forEach((client) => {
        if (client !== senderToExclude && client.readyState === WebSocket.OPEN) {
            client.send(message);
        }
    });
}